package example;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Created by IntelliJ IDEA.
 * User: stermi
 * Date: 29-nov-2009
 * Time: 11.26.33
 * To change this template use File | Settings | File Templates.
 */
public class Categoria {

	public static final String tabName = "categoria";

    public static final String idField = "id";
    public static final String nomeField = "nome";
	
    int id;
    String nome;

    public Categoria( ) {
        
    }
    
    public Result validate() {
    	Result result = new Result( true, null, "" );
    	
    	if ( nome.trim().equals("") ) {
    		result.result = false;
    		result.errorMessage += "Il nome non puo' essere vuoto\n";
    	}
    	
    	return result;
    	
    }

    public Result load( int id, Connection c ) {
        // load it from DB
    	Result result; 	
    	PreparedStatement pstmt = null;
        ResultSet rs = null;
        String sqlQuery = "SELECT * FROM " + tabName + " WHERE "+ idField + " = ?";
        
        try {
        	c.setAutoCommit(false);
        	pstmt = c.prepareStatement(sqlQuery);
        	pstmt.setInt(1, id  );
	        rs = pstmt.executeQuery();
	        
	        if ( rs.next() ) {
	        	this.set( rs );
	        	
	        	result = new Result( true, this, "");
	        	
	        } else {
	        	//errore, non c'era il record sul db
	        	System.out.println("La categoria con id " + this.id + " non e' presente sul database.");
	        	result = new Result( false, null, "");
	        }
	        
        } catch (SQLException e) {
        	System.out.println( "SQL Exception: " +e.getMessage());
            result = new Result(false, null,  "SQL Exception: " +e.getMessage() + " per categoria con ID " + this.id );
        } finally {
            try{
                if( rs != null )
                    rs.close();
                if( pstmt != null )
                    pstmt.close();
            } catch(Exception e){
            	result = new Result ( false, null, "Rilascio risorse non riuscito: " +e.getMessage() + "\nRecord non caricato con categoria ID " + this.id );
                System.out.println("Rilascio risorse non riuscito: "+e.getMessage());
            }
        }
        
        return result;
        
    }

    //Questo metodo viene solitamente usato per settare i parametri di un oggetto compilato da form
    private void set ( ResultSet rs ) throws SQLException {
    	this.id = rs.getInt( idField );
    	this.nome = rs.getString( nomeField );
    	
    	return;
    }
    
    public Result save( Connection c ) {
    	return save(c, true);
    }
    
    public Result save( Connection c, boolean validate ) {
        
    	Result result = null;
    	int rowInserted;
    	boolean insert;
    	String query = "";
    	PreparedStatement pstmt = null;
    	ResultSet rs = null;
    	
    	if ( validate ) {
    		result = validate();
    		if ( !result.result )
    			return result;
    	}
    	
    	try {
    		
    		c.setAutoCommit(false);
    		
    		if ( this.id < 1 ) { //non e' un nuovo record
    			query = "INSERT INTO "+ tabName +" ( " + idField + ", " + nomeField  + "  ) VALUES (DEFAULT,?)";
	    		insert = true;
	    		pstmt = c.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
	    		
	    	} else {
	    		c.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
	    		query = "UPDATE "+ tabName +" SET " + nomeField + " = ? WHERE " + idField + " = ?";
	    		insert = false;
	    		pstmt = c.prepareStatement(query);
	    		
	    	}
	    	

	    	pstmt.setString(1, this.nome );
	    	
	    	if ( this.id > 0 )
	    		pstmt.setInt(2, this.id  );
	    	
	    	rowInserted = pstmt.executeUpdate();
	    	if ( rowInserted > 0 ) {
	    		result = new Result ( true, this, "Record inserito per la categoria " + this.nome +  " con ID " + this.id  );
	    		if ( Test.DEBUG ) System.out.println( result.errorMessage );
	    		this.id = id;
	    	} else {
	    		result = new Result ( false, null, "Record NON inserito per la categoria " + this.nome +  " con ID " + this.id  );
	    		if ( Test.DEBUG ) System.out.println( result.errorMessage );
	    	}
	    	
	    	//Aggiorno l'id della categoria	    	
	    	if ( insert ) {
	    		rs = pstmt.getGeneratedKeys(); 
	    		if ( rs != null && rs.next() ) {
	    			this.id = rs.getInt(1); 
	    			if ( Test.DEBUG ) System.out.println("Operazione di " + ( insert ? " insert" : "update" ) + " avvenuta con successo per categoria " + this.nome +  " con ID " + this.id);
		    		result = new Result(true, this, "Operazione di insert avvenuta con successo per categoria " + this.nome +  " con ID " + this.id );
	    		}
	    		rs.close();	
	    	}
	    	
	        pstmt.close();
	    	c.commit();
	    	
	    	
	    	c.setAutoCommit(true);
	    	
	    	
	    	
    	} catch(Exception e){
    		result = new Result ( false, null, "Errore generale: " +e.getMessage() + "\nRecord non inserito per la categoria " + this.nome +  " con ID " + this.id  );
    		System.out.println( "Errore generale: " +e.getMessage());
            //e.printStackTrace();
            // rollback
            try{
            	System.out.println("Rollback, annullo modifiche al database");
                c.rollback();
            } catch(Exception eRollback){}
        
        } finally {
            try{
                if( rs != null )
                    rs.close();
                if( pstmt != null )
                    pstmt.close();
            } catch(Exception e){
            	result = new Result ( false, null, "Rilascio risorse non riuscito: "+e.getMessage() + "\nRecord non inserito per la categoria " + this.nome +  " con ID " + this.id  );
            	System.out.println(" Rilascio risorse non riuscito: "+e.getMessage());
            }
        }
        return result;
    }
    
    public Result delete( Connection c ) {
    	// cancellala dal db
    	String query = "";
    	int affectedRows = 0;
    	Result result = null;
    	PreparedStatement pstmt = null;
    	
    	try {
    		c.setAutoCommit(false);
    		query = "DELETE FROM " + tabName + " WHERE " + idField + " = ?";
    		pstmt = c.prepareStatement(query);
    		pstmt.setInt(1, this.id);
    		
    		affectedRows = pstmt.executeUpdate();
    		if ( affectedRows > 0 ) {
    			result = new Result ( true, null, "Record cancellato con categoria ID " + this.id );
	    	} else {
	    		result = new Result ( false, null, "Record NON cancellato con categoria ID " + this.id );
	    	}	
    		
    		pstmt.close();
    		c.commit();

    		
    	} catch(Exception e){
    		if ( Test.DEBUG ) System.out.println( "Errore generale: " +e.getMessage());
            result = new Result ( false, null, "Errore generale: " +e.getMessage() + "\nRecord non cancellato con categoria ID " + this.id );
            // rollback
            try{
            	if ( Test.DEBUG ) System.out.println("Rollback, annullo modifiche al database");
                c.rollback();
            } catch(Exception eRollback){}
        
        } finally {
            try{
                if( pstmt != null )
                    pstmt.close();
            } catch(Exception e){
            	result = new Result ( false, null, "Rilascio risorse non riuscito: " +e.getMessage() + "\nRecord non cancellato con categoria ID " + this.id );
                if ( Test.DEBUG ) System.out.println("Rilascio risorse non riuscito: "+e.getMessage());
            }
        }
        
        return result;
    }

    public String toString() {
        return this.nome;
    }

    

}
